package com.aisile.gateway.filters;

import com.aisile.model.student.pojos.User;
import com.google.gson.Gson;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.http.HttpCookie;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/**
 * @Auther:yry
 * @Date:2024/6/26 0026
 * @VERSON:1.0
 */
@Component
public class AuthorFilter implements GlobalFilter {
    /**
     * @param exchange 请求上下文对象 能获取到 跟请求和相应相关的东西
     * @param chain    过滤器调用链
     * @return
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 获取请求对象和响应对象
        ServerHttpRequest request = exchange.getRequest();
        ServerHttpResponse response = exchange.getResponse();

        try {
            // http://127.0.0.1:6001/stu/login/in  /stu/login/in
            if (request.getURI().getPath().contains("/login/in")) {
                return chain.filter(exchange);
            }
            // 拦截所有请求  前端能携带token 的方式有哪些？ 1， 请求头 2.请求参数 3.cookie 4.路径（X）
            // 正常开发  都是三选一（最优选 请求头）   讲课按照1， 请求头 2.请求参数 3.cookie 嵌套判断
            String token = request.getHeaders().getFirst("token");  // key value
            if (token == null || "".equals(token.trim())) {
                // 证明头信息中没有 看请求参数中有没有
                token = request.getQueryParams().getFirst("token");
                if (token == null || "".equals(token.trim())) {
                    // 证明请求参数中也没有 再看cookie 中有没有
                    HttpCookie httpCookie = request.getCookies().getFirst("token");
                    if (httpCookie != null) {
                        token = httpCookie.getValue().trim();
                    }
                }
            }
            if (token == null || "".equals(token.trim())) {
                // 证明彻底没给
                response.setStatusCode(HttpStatus.UNAUTHORIZED);
                return response.setComplete();
            }
            // 证明token有东西 但是不能证明token合法
            if (!"123".equals(token)) {
                // 证明token被篡改   不合法
                response.setStatusCode(HttpStatus.UNAUTHORIZED);
                return response.setComplete();
            }
            return chain.filter(exchange);
        }catch (Exception e){
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            return response.setComplete();
        }

    }
}
